#ifndef	_J_POZIVI_JEZGRE_H_
#define	_J_POZIVI_JEZGRE_H_

#include "vrijeme.h"
#include "tipkovnica.h"
#include "dretve.h"

/* Za dodat novu jezgrinu funkciju koja se poziva mehanizmom programskog prekida
   treba:
	1. funkcija mora biti tipa:	int funkcija(void *);

	2. definira se ID funkcije = ime u 'enum' ispod
	
	3. ubacit adresu funkcije u 'j_fun' (jos malo ispod) - mora biti na
	   istom mjestu kao i njen ID!
	
   Funkcija se poziva sa:	pv = j_funkcija(ID, pokazivac_na_parametar);
*/

//identifikatori jezgrinih funkcija (koji se pozivaju programskim prekidom)
//dodaj nove na kraj (pazi redoslijed mora odgovarat kazaljki u 'j_fun')
enum {
	FUNKCIJA1 = 0,
	FUNKCIJA2,
	FUNKCIJA3,

	STVORI_DRETVU,
	DRETVA_ODSTUPI,
	DRETVA_ZAVRSETAK,
	ID_DRETVE,
	DOHVATI_PRIORITET,
	POSTAVI_PRIORITET,
	CEKAJ_KRAJ_DRETVE,
	
	ALARM_POSTAVI,
	ALARM_OBRISI,
	
	TIPKOVNICA_DOHVATI,

	BROJ_J_FUNKCIJA
};

//pozivanje "jezgrinih" funkcija mehanizmom programskog prekida
//zove se iz "korisnickih" programa
int j_funkcija(int id, void *param);

//funkcija koja prihvaca programske prekide i poziva odgovarajucu jezgrinu f.
void j_pozivi_jezgre(int id);


#ifdef	_J_POZIVI_JEZGRE_C_

typedef int (*jfunkcija) (void *);


//deklaracija funkcija

// primjeri iz pozivi_jezgre.c
int funkcija1 (void *x);
int funkcija2 (void *x);
int funkcija3 (void *x);

//popis kazaljki na funkcije koje obradjuju odgovarajuci poziv
static jfunkcija j_fun[BROJ_J_FUNKCIJA] = {
	funkcija1,
	funkcija2,
	funkcija3,
	
	j_stvori_dretvu,
	j_dretva_odstupi,
	j_dretva_zavrsetak,
	j_id_dretve,
	j_dohvati_prioritet,
	j_postavi_prioritet,
	j_cekaj_kraj_dretve,

	j_alarm_postavi,
	j_alarm_obrisi,
	
	j_tipkovnica_dohvati
};


//struktura koja cuva sve potrebno za poziv j-funkcije
typedef struct _j_param_t_ {
	int id;         //id jezgrene funkcije
	void *param;    //parametar
	int *povr_vr;    //povratna vrijednost
} j_param_t;

#endif	/* _J_POZIVI_JEZGRE_C_ */
#endif	/* _J_POZIVI_JEZGRE_H_ */